#include "app_router.h"
#include "app_mqtt.h"
#include "app_message.h"
#include "app_device.h"
#include "log/log.h"
#include <assert.h>
#define MAX_DEVICE_SIZE 10

static Device *device_list[MAX_DEVICE_SIZE]; // 设备列表
static int device_count = 0; // 已注册设备数量

static int router_recv_callback(char *data, int len)
{
    // 将接收到json转换为message
    Message *message = app_message_initByJson(data);

    // 找到message对应的设备(根据conn_type判断)
    for (int i = 0; i < device_count; i++)
    {
        if (device_list[i]->conn_type == message->conn_type)
        { // 如果找到了
            // 将message转换为二进制数据
            char binary[256];
            len = app_message_toBinary(message, binary, sizeof(binary));
            // 让设备来接收二进制数据进行后续处理
            int result = app_device_recvMsg(device_list[i], binary, len);
            // 释放message
            app_message_free(message);

            return result;
        }
    }

    // 没有找到
    log_error("没有找到对应的设备");
    // 释放message
    app_message_free(message);

    return -1;
}

static /**
 * 发送消息到远程服务器
 */
int router_send_msg(Device *device, void *data, int len)
{
    assert(device);
    // 根据data生成Message结构体
    Message *message = app_message_initByBinary(data, len);
    // 将Message结构体转换为json
    char json[128];
    len = app_message_toJson(message, json, sizeof(json));
    // 利用mqtt客户发送消息
    app_mqtt_sendMsg(json, len);
    // 释放Message结构体
    app_message_free(message);

    return 0;
}


/**
 * 初始化路由器
 */
int app_router_init()
{
    // 初始化MQTT客户端
    if (app_mqtt_init() != 0) {
        log_error("MQTT初始化失败");
        return -1;
    }

    // 注册MQTT消息接收回调函数
    app_mqtt_setRecvCallback(router_recv_callback);

    return 0;
}

/**
 * 关闭路由器
 */
void app_router_close(){
    // 将设备列表中所有设备者先停止再关闭
    for (int i = 0; i < device_count; i++)
    {
        app_device_stop(device_list[i]);
        app_device_close(device_list[i]);
    }

    app_mqtt_close();
    
}
/**
 * 注册设备
 */
int app_router_register_device(Device *device){
    // 如果已经足够了，注册失败
    if (device_count >= MAX_DEVICE_SIZE) {
        log_error("设备数量已达到最大值");
        return -1;
    }
    // 将设备添加到设备列表中
    device_list[device_count++] = device;

    // 给设备指定send_msg函数
    device->funcs->send_msg = router_send_msg;

    // 启动l设备
    app_device_start(device);

    return 0;
}

